import axios from "axios";
import {ElMessage} from "element-plus";
import errorCode from "./errorCode";
import router from "@/rotuer"
import {getAccessToken} from "./auth";

// 创建axios实例
const request = axios.create({
    baseURL: import.meta.env.VITE_API_BASE_URL + '/admin-api', // api 的 base_url
    timeout: 5000, // 请求超时时间
})

// 添加请求拦截器
request.interceptors.request.use((config) => {
        // 在发送请求之前做些什么
        // 是否需要设置 token
        const isToken = (config.headers || {}).isToken === false
        // 设置请求token
        if (!isToken && getAccessToken()) {
            config.headers['Authorization'] = 'Bearer ' + getAccessToken()
        }
        return config
    }
)

const ignoreMsgs = [
    "无效的刷新令牌", // 刷新令牌被删除时，不用提示
    "刷新令牌已过期" // 使用刷新令牌，刷新获取新的访问令牌时，结果因为过期失败，此时需要忽略。否则，会导致继续 401，无法跳转到登出界面
]


// 添加响应拦截器
request.interceptors.response.use((response) => {
    // 成功回调
    const code = response.data.code || 0;
    // 错误信息
    const message = response.data.msg || errorCode[code as keyof typeof errorCode] || errorCode['default']
    if (ignoreMsgs.indexOf(message) !== -1) { // 如果是忽略的错误码，直接返回 msg 异常
        router.push('/login').catch((err) => {
            console.error('路由跳转失败', err)
        })
        return Promise.reject(message)
    } else if (code === 401) {
        // 未登陆跳转到登陆页面
        console.log('跳转到登录页面')
        router.push('/login').catch((err) => {
            console.error('路由跳转失败', err)
        })
        return Promise.reject(message)
    } else if (code === 403) {
        //无权限访问
        return Promise.reject(message)
    } else if (code !== 0) {

        return Promise.reject(message)
    }
    // 简化数据
    return response.data
}, (error) => {
    // 失败回调，处理http网络请求错误
    // HTTP 状态码处理
    let message = error.message

    if (error.response) {
        switch (error.response.status) {
            case 400:
                message = '请求错误'
                break
            case 401:
                message = '未授权，请重新登录'
                // 跳转登录页
                break
            case 403:
                message = '拒绝访问'
                break
            case 404:
                message = '请求地址出错'
                break
            case 500:
                message = '服务器内部错误'
                break
            default:
                message = `连接出错 (${error.response.status})`
        }
    }
    ElMessage({
        message,
        type: 'error'
    })
    return Promise.reject(error)
})

// 暴露
export default request